package com.ror.java.se.exception;

/* 需求：
    键盘录入自己心仪的女朋友姓名和年龄。
    姓名的长度在3－10之间，
    年龄的范围为18-40岁。
    超出这个范围是异常数据不能赋值，需要重新录入，一直录到正确为止。
    提示：
        需要考虑用户在键盘录入时的所有情况。
        比如：录入年龄时超出范围，录入年龄时录入了abc等情况
 */

import java.util.Scanner;

public class Demo02 {
    public static void main(String[] args) {
        Girlfriend gf = new Girlfriend();
        Scanner sc = new Scanner(System.in);

        while (true) {
            try {
                System.out.println("输入心仪的女朋友姓名：");
                String name = sc.nextLine();
                gf.setName(name);
                System.out.println("输入心仪的女朋友年龄：");
                int age = Integer.parseInt(sc.nextLine());
                gf.setAge(age);
                break; //输入无误，跳出循环
            } catch (NumberFormatException e) {
                e.printStackTrace();
                System.err.println("年龄输入有误，请输入数字");
            } catch (NameFormatException e) {
                e.printStackTrace();
                System.err.println("姓名格式异常处理逻辑");
            } catch (AgeOutOfBoundsException e) {
                e.printStackTrace();
                System.err.println("年龄越界异常处理逻辑");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        sc.close();
        System.out.println(gf);
    }

    static class Girlfriend {
        String name;
        int age;

        public Girlfriend() {
        }

        public Girlfriend(String name, int age) {
            this.name = name;
            this.age = age;
        }

        /**
         * 获取
         *
         * @return name
         */
        public String getName() {
            return name;
        }

        /**
         * 设置
         *
         * @param name
         */
        public void setName(String name) {
            if (name.length() < 3 || name.length() > 10)
                throw new NameFormatException(name + " 姓名长度有误，请输入符合的值(3-10个字符)");
            this.name = name;
        }

        /**
         * 获取
         *
         * @return age
         */
        public int getAge() {
            return age;
        }

        /**
         * 设置
         *
         * @param age
         */
        public void setAge(int age) {
            if (age < 18 || age > 40)
                throw new AgeOutOfBoundsException(age + " 年龄范围有误，请输入符合的值(18-40岁)");
            this.age = age;
        }

        public String toString() {
            return "Student{name = " + name + ", age = " + age + "}";
        }
    }
}
